﻿using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace APP.HELPER.Utils.System
{
    public class SystemMetricHelper
    {
        [StructLayout(LayoutKind.Sequential)]
        private class NONCLIENTMETRICS
        {
            public int cbSize = Marshal.SizeOf(typeof(SystemMetricHelper.NONCLIENTMETRICS));
            public int iBorderWidth;
            public int iScrollWidth;
            public int iScrollHeight;
            public int iCaptionWidth;
            public int iCaptionHeight;
            [MarshalAs(UnmanagedType.Struct)]
            public SystemMetricHelper.LOGFONT lfCaptionFont;
            public int iSmCaptionWidth;
            public int iSmCaptionHeight;
            [MarshalAs(UnmanagedType.Struct)]
            public SystemMetricHelper.LOGFONT lfSmCaptionFont;
            public int iMenuWidth;
            public int iMenuHeight;
            [MarshalAs(UnmanagedType.Struct)]
            public SystemMetricHelper.LOGFONT lfMenuFont;
            [MarshalAs(UnmanagedType.Struct)]
            public SystemMetricHelper.LOGFONT lfStatusFont;
            [MarshalAs(UnmanagedType.Struct)]
            public SystemMetricHelper.LOGFONT lfMessageFont;
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        private class LOGFONT
        {
            public int lfHeight;
            public int lfWidth;
            public int lfEscapement;
            public int lfOrientation;
            public int lfWeight;
            public byte lfItalic;
            public byte lfUnderline;
            public byte lfStrikeOut;
            public byte lfCharSet;
            public byte lfOutPrecision;
            public byte lfClipPrecision;
            public byte lfQuality;
            public byte lfPitchAndFamily;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string lfFaceName;
        }
        private const int SPI_GETNONCLIENTMETRICS = 41;
        private const int SPI_SETNONCLIENTMETRICS = 42;
        public static SystemMetricHelper NewFont = SystemMetricHelper.CurrentMetrics();
        public static SystemMetricHelper OldFont = SystemMetricHelper.CurrentMetrics();
        private SystemMetricHelper.NONCLIENTMETRICS pvParam;
        public Font CaptionFont
        {
            get
            {
                return Font.FromLogFont(this.pvParam.lfCaptionFont);
            }
            set
            {
                value.ToLogFont(this.pvParam.lfCaptionFont);
            }
        }
        public Font MenuFont
        {
            get
            {
                return Font.FromLogFont(this.pvParam.lfMenuFont);
            }
            set
            {
                value.ToLogFont(this.pvParam.lfMenuFont);
            }
        }
        public Font MessageFont
        {
            get
            {
                return Font.FromLogFont(this.pvParam.lfMessageFont);
            }
            set
            {
                value.ToLogFont(this.pvParam.lfMessageFont);
            }
        }
        public Font StatusFont
        {
            get
            {
                return Font.FromLogFont(this.pvParam.lfStatusFont);
            }
            set
            {
                value.ToLogFont(this.pvParam.lfStatusFont);
            }
        }
        public Font SmCaptionFont
        {
            get
            {
                return Font.FromLogFont(this.pvParam.lfSmCaptionFont);
            }
            set
            {
                value.ToLogFont(this.pvParam.lfSmCaptionFont);
            }
        }
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern bool SystemParametersInfo(int Action, int uiParam, [In] [Out] SystemMetricHelper.NONCLIENTMETRICS pvParam, int WinIni);
        public static SystemMetricHelper CurrentMetrics()
        {
            SystemMetricHelper.NONCLIENTMETRICS nONCLIENTMETRICS = new SystemMetricHelper.NONCLIENTMETRICS();
            SystemMetricHelper.SystemParametersInfo(41, nONCLIENTMETRICS.cbSize, nONCLIENTMETRICS, 0);
            return new SystemMetricHelper
            {
                pvParam = nONCLIENTMETRICS
            };
        }
        public void Apply()
        {
            SystemMetricHelper.SystemParametersInfo(42, this.pvParam.cbSize, this.pvParam, 1);
        }
        public static void SetNewFont()
        {
            SystemMetricHelper systemMetricHelper = SystemMetricHelper.CurrentMetrics();
            systemMetricHelper.CaptionFont = new Font("Tahoma", 8f, FontStyle.Bold);
            systemMetricHelper.StatusFont = new Font("Tahoma", 8f, FontStyle.Regular);
            systemMetricHelper.Apply();
            MessageBox.Show("Font hệ thống đã được thay đổi.\n\nVui lòng khởi động lại phần mềm để phần mềm được áp dụng.", "Thông báo");
            Application.Restart();
        }
        public static void RestoreFont()
        {
            SystemMetricHelper.OldFont.Apply();
            MessageBox.Show("Font hệ thống đã được thay đổi.\n\nVui lòng khởi động lại phần mềm để phần mềm được áp dụng cấu hình mới.", "Thông báo");
        }
    }
}
